#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
@File    : log_handler.py
@Description : 日志处理模块，提供日志记录功能
'''

import os
import logging
from logging.handlers import TimedRotatingFileHandler
import colorlog
from datetime import datetime
from typing import Optional, Dict, Any

# 导入配置
from config.settings import config


class LogHandler:
    """
    日志处理类，提供日志记录功能
    """
    # 日志级别映射
    level_map = {
        'DEBUG': logging.DEBUG,
        'INFO': logging.INFO,
        'WARNING': logging.WARNING,
        'ERROR': logging.ERROR,
        'CRITICAL': logging.CRITICAL
    }
    
    # 日志颜色映射
    log_colors_config = {
        'DEBUG': 'cyan',
        'INFO': 'green',
        'WARNING': 'yellow',
        'ERROR': 'red',
        'CRITICAL': 'bold_red'
    }
    
    def __init__(self, name: str = 'apitest', level: str = None, log_dir: str = None):
        """
        初始化日志处理类
        
        Args:
            name: 日志名称
            level: 日志级别，默认为None，使用配置文件中的级别
            log_dir: 日志目录，默认为None，使用配置文件中的目录
        """
        self.name = name
        self.level = level or config.log_level
        self.log_dir = log_dir or config.log_dir
        
        # 创建日志目录
        if not os.path.exists(self.log_dir):
            os.makedirs(self.log_dir)
        
        # 日志文件路径
        self.log_file = os.path.join(self.log_dir, f"{self.name}.log")
        
        # 创建日志记录器
        self.logger = logging.getLogger(self.name)
        self.logger.setLevel(self.level_map.get(self.level, logging.INFO))
        
        # 避免重复添加处理器
        if not self.logger.handlers:
            # 添加控制台处理器
            self._add_console_handler()
            # 添加文件处理器
            self._add_file_handler()
    
    def _add_console_handler(self) -> None:
        """
        添加控制台日志处理器
        """
        console_handler = logging.StreamHandler()
        console_handler.setLevel(self.level_map.get(self.level, logging.INFO))
        
        # 设置日志格式
        formatter = colorlog.ColoredFormatter(
            '%(log_color)s[%(asctime)s] [%(levelname)s] [%(name)s] - %(message)s',
            log_colors=self.log_colors_config,
            datefmt='%Y-%m-%d %H:%M:%S'
        )
        console_handler.setFormatter(formatter)
        
        # 添加处理器到日志记录器
        self.logger.addHandler(console_handler)
    
    def _add_file_handler(self) -> None:
        """
        添加文件日志处理器
        """
        # 创建TimedRotatingFileHandler，按天切割日志文件
        file_handler = TimedRotatingFileHandler(
            filename=self.log_file,
            when='midnight',
            interval=1,
            backupCount=config.log_backup_count,
            encoding='utf-8'
        )
        file_handler.setLevel(self.level_map.get(self.level, logging.INFO))
        
        # 设置日志格式
        formatter = logging.Formatter(
            '[%(asctime)s] [%(levelname)s] [%(name)s] - %(message)s',
            datefmt='%Y-%m-%d %H:%M:%S'
        )
        file_handler.setFormatter(formatter)
        
        # 添加处理器到日志记录器
        self.logger.addHandler(file_handler)
    
    def get_logger(self) -> logging.Logger:
        """
        获取日志记录器
        
        Returns:
            日志记录器对象
        """
        return self.logger
    
    def debug(self, message: str, *args: Any, **kwargs: Any) -> None:
        """
        记录DEBUG级别日志
        
        Args:
            message: 日志消息
            *args: 可变参数
            **kwargs: 关键字参数
        """
        self.logger.debug(message, *args, **kwargs)
    
    def info(self, message: str, *args: Any, **kwargs: Any) -> None:
        """
        记录INFO级别日志
        
        Args:
            message: 日志消息
            *args: 可变参数
            **kwargs: 关键字参数
        """
        self.logger.info(message, *args, **kwargs)
    
    def warning(self, message: str, *args: Any, **kwargs: Any) -> None:
        """
        记录WARNING级别日志
        
        Args:
            message: 日志消息
            *args: 可变参数
            **kwargs: 关键字参数
        """
        self.logger.warning(message, *args, **kwargs)
    
    def error(self, message: str, *args: Any, **kwargs: Any) -> None:
        """
        记录ERROR级别日志
        
        Args:
            message: 日志消息
            *args: 可变参数
            **kwargs: 关键字参数
        """
        self.logger.error(message, *args, **kwargs)
    
    def critical(self, message: str, *args: Any, **kwargs: Any) -> None:
        """
        记录CRITICAL级别日志
        
        Args:
            message: 日志消息
            *args: 可变参数
            **kwargs: 关键字参数
        """
        self.logger.critical(message, *args, **kwargs)


# 创建默认日志记录器
_default_logger = LogHandler().get_logger()


def get_logger(name: str = 'apitest', level: str = None, log_dir: str = None) -> logging.Logger:
    """
    获取日志记录器的便捷函数
    
    Args:
        name: 日志名称
        level: 日志级别
        log_dir: 日志目录
        
    Returns:
        日志记录器对象
    """
    return LogHandler(name, level, log_dir).get_logger()


# 提供全局日志函数
def debug(message: str, *args: Any, **kwargs: Any) -> None:
    """
    记录DEBUG级别日志
    
    Args:
        message: 日志消息
        *args: 可变参数
        **kwargs: 关键字参数
    """
    _default_logger.debug(message, *args, **kwargs)


def info(message: str, *args: Any, **kwargs: Any) -> None:
    """
    记录INFO级别日志
    
    Args:
        message: 日志消息
        *args: 可变参数
        **kwargs: 关键字参数
    """
    _default_logger.info(message, *args, **kwargs)


def warning(message: str, *args: Any, **kwargs: Any) -> None:
    """
    记录WARNING级别日志
    
    Args:
        message: 日志消息
        *args: 可变参数
        **kwargs: 关键字参数
    """
    _default_logger.warning(message, *args, **kwargs)


def error(message: str, *args: Any, **kwargs: Any) -> None:
    """
    记录ERROR级别日志
    
    Args:
        message: 日志消息
        *args: 可变参数
        **kwargs: 关键字参数
    """
    _default_logger.error(message, *args, **kwargs)


def critical(message: str, *args: Any, **kwargs: Any) -> None:
    """
    记录CRITICAL级别日志
    
    Args:
        message: 日志消息
        *args: 可变参数
        **kwargs: 关键字参数
    """
    _default_logger.critical(message, *args, **kwargs)


if __name__ == '__main__':
    # 测试日志记录
    logger = get_logger()
    logger.debug("这是一条调试日志")
    logger.info("这是一条信息日志")
    logger.warning("这是一条警告日志")
    logger.error("这是一条错误日志")
    logger.critical("这是一条严重错误日志")